package pe.com.cotelasa.seguridad.controlador.helper;

import java.util.ArrayList;
import java.util.List;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.MethodExpression;
import javax.faces.context.FacesContext;
import org.apache.log4j.Logger;
import org.primefaces.component.menubar.Menubar;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import pe.com.cotelasa.scp.common.ConstantesWeb;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.seguridad.common.util.Constantes;
import pe.com.cotelasa.seguridad.entidad.Menu;

public class MenuBarHelper {

    private static Logger logger  = Logger.getLogger(MenuBarHelper.class);
    
    public MenuBarHelper() {
    }
    
    public static Menubar getMenuBar(List<Menu> listaMenu) throws Exception{
        Menubar menuBar =  new Menubar();
        
        List<MenuItem> listaMenuItemPlantilla = cargarMenuPlantilla();
        menuBar.getChildren().add(listaMenuItemPlantilla.get(0));
        menuBar.setAutoDisplay(false);
        for (Menu menu : listaMenu) {
            Submenu subMenu = null;
            if(menu.getIdMenuPadre()==null){
                subMenu = new Submenu();
                subMenu.setId(Constantes.Menu.VARIABLE_ID_MENU_ITEM + menu.getId());
                subMenu.setLabel(menu.getNombre().toUpperCase());
                subMenu.setIcon("ui-icon ui-icon-calculator");
                
                menuBar.getChildren().add(subMenu);
                cargarHijos(menu,listaMenu,subMenu);
            }
            
        }
        
        menuBar.getChildren().add(listaMenuItemPlantilla.get(1));
        menuBar.getChildren().add(listaMenuItemPlantilla.get(2));
        menuBar.getChildren().add(listaMenuItemPlantilla.get(3));
        return menuBar;
    }

    private static void cargarHijos(Menu menuPadre,List<Menu> listaHijos,Submenu subMenu)throws Exception{
        FacesContext facesCtx = FacesContext.getCurrentInstance();
		ELContext elCtx = facesCtx.getELContext();
		ExpressionFactory expFact = facesCtx.getApplication().getExpressionFactory();
        Submenu subMenuHijo = null;
        MenuItem menuItem = null;
        for (Menu menuHijo : listaHijos) {
             if(menuHijo.getIdMenuPadre()!=null && menuHijo.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()){
                if(menuPadre.getId() == menuHijo.getIdMenuPadre().getId()){
                    if(verificarHijos(menuHijo, listaHijos)){
                        subMenuHijo =  new Submenu();
						subMenuHijo.setId(Constantes.Menu.VARIABLE_ID_MENU_ITEM+ menuHijo.getId());
						subMenuHijo.setLabel(menuHijo.getNombre());
                        subMenuHijo.setStyle("color:#E17009 !important;");
                        subMenu.getChildren().add(subMenuHijo);
                        cargarHijos(menuHijo,listaHijos,subMenuHijo);
                    }else{
                        menuItem = new MenuItem();
						menuItem.setId(Constantes.Menu.VARIABLE_ID_MENU_ITEM + menuHijo.getId());
						menuItem.setValue(menuHijo.getNombre());
                        menuItem.setStyle("color:#336699");
                        menuItem.setAjax(false);
                        MethodExpression aEx = expFact.createMethodExpression(elCtx,menuHijo.getAccion(), String.class, new Class[0]);
                        menuItem.setActionExpression(aEx);
			subMenu.getChildren().add(menuItem);
                }
                }
             } 
        }
    }

    private static boolean verificarHijos(Menu padre, List<Menu> listaMenu){
        for (Menu menu : listaMenu) {
            if(menu.getIdMenuPadre()!=null){
                if(menu.getIdMenuPadre().getId()==padre.getId()){
                    return true;
                }
            }
        }
        return false;
    }
    
    private static List<MenuItem> cargarMenuPlantilla(){
    	FacesContext facesCtx = FacesContext.getCurrentInstance();
    	ELContext elCtx = facesCtx.getELContext();
    	ExpressionFactory expFact = facesCtx.getApplication().getExpressionFactory();
        List<MenuItem> listaMenuPlantilla = new ArrayList<MenuItem>();
        MenuItem menuItem;
        menuItem = new MenuItem();
        menuItem.setId(Constantes.Menu.VARIABLE_ID_MENU_ITEM + Constantes.Menu.VARIABLE_ID_MENU_ITEM_INICIO);
		menuItem.setValue("INICIO");
		menuItem.setIcon("ui-icon ui-icon-home");
        menuItem.setAjax(true);
        menuItem.setUrl(URLPaginacion.Seguridad.URL_HOME);
        listaMenuPlantilla.add(menuItem);	
        menuItem = new MenuItem();
        menuItem.setId(Constantes.Menu.VARIABLE_ID_MENU_ITEM + Constantes.Menu.VARIABLE_ID_MENU_ITEM_AYUDA);
        menuItem.setValue("AYUDA");
        menuItem.setAjax(true);
        menuItem.setUrl(URLPaginacion.Seguridad.URL_PAGINA_AYUDA);
        menuItem.setIcon("ui-icon ui-icon-help");
        listaMenuPlantilla.add(menuItem);	
        menuItem = new MenuItem();
        menuItem.setId(Constantes.Menu.VARIABLE_ID_MENU_ITEM + Constantes.Menu.VARIABLE_ID_MENU_ITEM_CAMBIAR_CONTRACENA );
        menuItem.setValue("");
        menuItem.setIcon("ui-icon ui-icon-gear");
        menuItem.setUrl(URLPaginacion.Seguridad.URL_PAGINA_CAMBIAR_CONTRACENA);   
        MethodExpression aEx = expFact.createMethodExpression(elCtx,"#{MBContracena.mostrarPantalla()}", String.class, new Class[0]);
        menuItem.setActionExpression(aEx);
        listaMenuPlantilla.add(menuItem);	
        menuItem = new MenuItem();
        menuItem.setId(Constantes.Menu.VARIABLE_ID_MENU_ITEM + Constantes.Menu.VARIABLE_ID_MENU_ITEM_SALIR);
        menuItem.setValue("SALIR");
        menuItem.setIcon("ui-icon ui-icon-close");
        menuItem.setUrl(URLPaginacion.Seguridad.URL_PAGINA_LOGOUT);
        listaMenuPlantilla.add(menuItem);
        return listaMenuPlantilla;
    }
    
    
    public static Menubar getMenuBarHardCode() {
        Menubar menuBar = new Menubar();
        Submenu subMenu = null;
        MenuItem menuItem = null;

        menuItem = new MenuItem();
        menuItem.setId(ConstantesWeb.Menu.VARIABLE_ID_MENU_ITEM + "Inicio");
        menuItem.setValue("Inicio");
        menuItem.setStyle("color:#FFFFFF");
        menuItem.setUrl("/principal.anx");
        menuItem.setIcon("ui-icon ui-icon-home");
        menuBar.getChildren().add(menuItem);

        subMenu = new Submenu();
        subMenu.setId(ConstantesWeb.Menu.VARIABLE_ID_MENU_CON_SUBMENU + "Mantenimiento");
        subMenu.setLabel("Mantenimiento");
        subMenu.setIcon("ui-icon ui-icon-calculator");

        menuItem = new MenuItem();
        menuItem.setId(ConstantesWeb.Menu.VARIABLE_ID_MENU_ITEM + "Empresa");
        menuItem.setValue("Mantenimiento Empresa");
        menuItem.setUrl("/mantenimiento/empresa/listarEmpresa.anx");
        subMenu.getChildren().add(menuItem);

        menuBar.getChildren().add(subMenu);


        menuItem = new MenuItem();
        menuItem.setId(ConstantesWeb.Menu.VARIABLE_ID_MENU_ITEM + "Proveedor");
        menuItem.setValue("Mantenimiento Proveedor");
        menuItem.setUrl("/mantenimiento/proveedor/listarProveedor.anx");
        subMenu.getChildren().add(menuItem);

        menuBar.getChildren().add(subMenu);


        menuItem = new MenuItem();
        menuItem.setId(ConstantesWeb.Menu.VARIABLE_ID_MENU_ITEM + "Cliente");
        menuItem.setValue("Mantenimiento Cliente");
        menuItem.setUrl("/mantenimiento/cliente/listarCliente.anx");
        subMenu.getChildren().add(menuItem);

        menuBar.getChildren().add(subMenu);



        menuItem = new MenuItem();
        menuItem.setId(ConstantesWeb.Menu.VARIABLE_ID_MENU_ITEM + "Ayuda");
        menuItem.setValue("AYUDA");
        menuItem.setStyle("color:#FFFFFF");
        menuItem.setUrl("/faces/paginas/ayuda.anx");
        menuItem.setIcon("ui-icon ui-icon-help");
        menuBar.getChildren().add(menuItem);

        menuItem = new MenuItem();
        menuItem.setId(ConstantesWeb.Menu.VARIABLE_ID_MENU_ITEM + "Salir");
        menuItem.setValue("SALIR");
        menuItem.setStyle("color:#FFFFFF");
        menuItem.setOnclick("return cerrar()");
        menuItem.setIcon("ui-icon ui-icon-close");
        menuBar.getChildren().add(menuItem);

        return menuBar;
    }
}
